package main

import (
	"container/heap"
	"fmt"
	"sort"
)

type KthLargest struct {
	sort.IntSlice
	k int
}

//36ms 20%,7.9MB 28%
func Constructor(k int, nums []int) KthLargest {
	kl := KthLargest{k: k}
	for _, val := range nums {
		kl.Add(val)
	}
	return kl
}

func (kl *KthLargest) Push(v interface{}) {
	kl.IntSlice = append(kl.IntSlice, v.(int))
}

func (kl *KthLargest) Pop() interface{} {
	a := kl.IntSlice
	v := a[len(a)-1]
	kl.IntSlice = a[:len(a)-1]
	return v
}

func (kl *KthLargest) Add(val int) int {
	heap.Push(kl, val)
	if kl.Len() > kl.k {
		heap.Pop(kl)
	}
	return kl.IntSlice[0]
}

func main() {
	s1 := []int{1, 2, 3, 4, 5, 6}
	//kl := Constructor(2, s1)
	kl := KthLargest{k: 2}
	for _, val := range s1 {
		kl.Add(val)
	}
	fmt.Println(kl)
	s2 := make([]int, 2)
	fmt.Println(s2, len(s2))
	s3 := []int{}
	fmt.Println(s3, len(s3))
	test()
}

func test() {
	type heap []int
	s1 := []int{1, 2, 3, 4, 5, 6}
	h := heap(s1)
	fmt.Println(h)
}
